package simpledb.transaction;

import java.io.Serializable;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 该类用于唯一标识一个事务（Transaction）。在数据库中，每个事务都需要一个唯一的 ID 来进行并发控制、日志记录、恢复处理等操作。
 * 这个类通过一个静态的原子计数器（AtomicLong）来保证生成的事务 ID 是线程安全且全局唯一的。
 * 此外，该类实现了 Serializable 接口，说明它可以被序列化，便于在网络传输或持久化存储中使用。
 */
public class TransactionId implements Serializable {

    // 序列化版本号，确保不同版本之间兼容
    private static final long serialVersionUID = 1L;

    // 使用 AtomicLong 确保多线程环境下生成唯一ID的安全性
    static final AtomicLong   counter          = new AtomicLong(0);

    // 当前事务的唯一ID
    final long                myid;

    /**
     * 构造方法，为当前事务分配一个唯一ID。
     * 每次调用构造函数时，counter 自动递增。
     */
    public TransactionId() {
        myid = counter.getAndIncrement();
    }

    /**
     * 获取当前事务的ID值。
     *
     * @return 事务的唯一ID（long类型）
     */
    public long getId() {
        return myid;
    }

    /**
     * 判断两个 TransactionId 是否相等。
     * 只有当它们的 myid 值相同时表示同一个事务。
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true; // 同一对象直接返回true
        if (obj == null)
            return false; // 空对象不能比较
        if (getClass() != obj.getClass())
            return false; // 不同类不相等

        TransactionId other = (TransactionId) obj;
        return myid == other.myid; // 比较实际的ID值
    }

    /**
     * 返回该事务ID的哈希码。
     * 哈希码基于 myid 的值计算得出，确保相同的ID得到相同的哈希值。
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        // 对 long 型数据做位运算，使其适配 int 类型的 hashcode
        result = prime * result + (int) (myid ^ (myid >>> 32));
        return result;
    }
}
